package com.cctc.juc.source.Bitc.Bvolatile;
/**
 * 【volatile 关键字】
 * 面试题：Java 中的 volatile 变量是什么？
 * 简述：volatile 是一个修饰符，用于修饰类的成员变量。
 * 在 JMM 内存模型中，一个线程对成员变量的操作对其他线程是透明的。
 * 即每个线程都有自己的栈内存，用于存储本地变量、方法参数和方法（栈）调用，一个线程中存储的变量是从堆内存中复制过来的，是线程私有的，对其他线程不可见，如果多个线程使用该变量就会引发线程安全问题。
 * 这个时候，volatile 变量就可以发挥作用了，它要求线程强制从堆内存中读取变量的值，这就确保了线程读取到的变量在同内存中是一致的。
 * 对于使用 volatile 关键字修饰的变量，JVM 会：
 * - 在 volatile 变量的读操作前后分别插入一个读读屏障、读写屏障；
 * - 在 volatile 变量的写操作前后分别插入一个写写屏障、写读屏障；
 * 从而保障 volatile 变量的内存可见性和指令有序性。
 * 且 volatile 变量遵循于 JMM 的 Happens-Before 先行发生规则，即 volatile 变量规则:
 * - 前一个线程对 volatile 变量的写操作一定要先行发生于后一线程个 volatile 的读操作。
 * 综上所述，volatile 关键字是 JVM 为我们提供的最简单、最轻量级的线程间通信方式。
 * 它可以保障 volatile 变量的内存可见性和指令有序性。
 * - 但无法保证 volatile 变量操作的原子性，通常情况下，需要与 CAS 原子操作组合使用，共同实现共享变量的线程安全操作。
 */